package com.example.demo_widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

/**
 * @author yaotianxue
 * @description
 * @date 2025/2/8
 */
public class MyView extends View {
    private Paint paint; //画笔
    private float radius;  //半径
    private int color = Color.BLUE; //颜色

    //java代码 new MyView()
    public MyView(Context context) {
        super(context);
        initPaint();
    }
    //xml布局
    public MyView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyView);
        radius = typedArray.getDimension(R.styleable.MyView_myRadius,100f);
        color = typedArray.getColor(R.styleable.MyView_myColor,Color.BLUE);
        //防止内存泄漏,记得回收
        typedArray.recycle();
        initPaint();
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint();
    }

    public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        initPaint();
    }

    /**
     * 初始化画笔
     */
    private void initPaint(){
        paint = new Paint();
        paint.setColor(color);
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);//抗锯齿
        paint.setDither(true);//防止抖动
    }

    /**
     * 绘制：
     *尽量不要在onDraw方法中new对象，因为onDraw方法会频繁调用，会产生大量对象，导致内存抖动
     */
    @Override
    protected void onDraw(@NonNull Canvas canvas) {//canvas：画布
        super.onDraw(canvas);
        //绘制圆
        canvas.drawCircle(getMeasuredWidth()/2,getMeasuredHeight()/2,radius,paint);
    }

    /**
     * 测量大小：宽度和高度
     *
     * 1.MeasureSpec测量规格32位 = 测量模式（高2位）+测量大小（低30位）
     * 2.三种测量模式

         （1）.EXACTLY : 精确测量模式
         当该视图的 layout_width 或者 layout_height 指定为具体数值或者 match_parent 时生效，表示父视图已经决定了子视图的精确大小，这种模式下 View 的测量值就是 SpecSize 的值。

         （2）.AT_MOST：最大值模式.
         当前视图的 layout_width 或者 layout_height 指定为 wrap_content 时生效，此时子视图的尺寸可以是不超过父视图运行的最大尺寸的任何尺寸。

         （3）.UNSPECIFIED：不指定测量模式，
         父视图没有限制子视图的大小，子视图可以是想要的任何尺寸，通常用于系统内部，应用开发中很少使用到。比如listview就是这个模式
     */
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //宽度
        //获得测量模式
        int width_mode = MeasureSpec.getMode(widthMeasureSpec);
        //获得测量大小
        int width_size = MeasureSpec.getSize(widthMeasureSpec);
        if(width_mode == MeasureSpec.EXACTLY){
            Log.d("TAG", "onMeasure: 精确模式");
        }else if(width_mode == MeasureSpec.AT_MOST){
            Log.d("TAG", "onMeasure: 最大值模式");
            width_size = (int)(radius * 2 + 20);
        }
        //高度
        //获得测量模式
        int height_mode = MeasureSpec.getMode(heightMeasureSpec);
        //获得测量大小
        int height_size = MeasureSpec.getSize(heightMeasureSpec);
        if(height_mode == MeasureSpec.EXACTLY){
            Log.d("TAG", "onMeasure: 精确模式");
        }else if(height_mode == MeasureSpec.AT_MOST){
            Log.d("TAG", "onMeasure: 最大值模式");
            height_size = (int)(radius * 2 + 20);
        }
        //设置大小
        setMeasuredDimension(width_size,height_size);
    }
}
